/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package MiddleLayer;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author ThanhTri
 * Lớp quản lý toàn bộ những lá bài mà client hay server đang giữ.
 */


public class Cards {
    List lstOfCards = new ArrayList(); //danh sách các lá bài của người chơi
    List lstWinCards = new ArrayList();//danh sách các lá bài mà người chơi thắng
    
//    Cards()
//    {
//        for(int card = 0; card < 52; ++card)
//        {
//            this.lstOfCards.add(new Card(card));
//        }
//    }

    /**
     * Thêm lá bài mới mà người chơi có thể sử dụng
     */
    public void addCard(int id)
    {
        lstOfCards.add(new Card(id));
    }

    /**
     * Xóa sạch dữ liệu, import lại từ đầu
     */
    public void clearCards()
    {
        this.lstOfCards.clear();
        this.lstWinCards.clear();
    }

    /**
     * Thường chỉ sử dụng hàm này trong việc trao đổi bài. Cân nhắc cẩn thận khi sử dụng
     * @param id ID của lá bài sẽ bị bỏ
     * @return Kết quả trả về cho biết có loại bỏ được hay không
     */
    public boolean removeCard(int id)
    {
        boolean bResult = false;
        for(int i = 0; i < this.lstOfCards.size(); ++i)
        {
            if((Integer) this.lstOfCards.get(i) == id)
            {
                this.lstOfCards.remove(i);
                bResult = true;
            }
        }

        return bResult;
    }

    /**
     * Lá bài này đã được sử dụng --> Bỏ đi
     */
    public boolean playThisCard(int id)
    {
        for(int iCard = 0; iCard < lstOfCards.size(); ++ iCard)
        {
            Card card = (Card) lstOfCards.get(iCard);
            if(card.getId() == id)
            {
                card.setbIsUsed();
                return true;
            }
        }
        return false;
    }

    /**
     * Trả về danh sách các lá bài có thể còn chơi được
     */
    public List<Integer> getCardLst()
    {
        List<Integer> lstResults = null;

        for(int iCard = 0; iCard < lstOfCards.size(); ++ iCard)
        {
            Card card = (Card) lstOfCards.get(iCard);
            if(!card.isbIsUsed())
            {
                lstResults.add(card.getId());
            }
        }

        return lstResults;
    }

    //Thêm lá bài thắng được vào danh sách
    public void addWinCard(int id)
    {
        lstWinCards.add(new Card(id));
    }

      //Trả về danh sách các lá bài có thể còn chơi được
    public List<Integer> getWinCardLst()
    {
        List<Integer> lstResults = null;

        for(int iCard = 0; iCard < lstWinCards.size(); ++ iCard)
        {
            Card card = (Card) lstWinCards.get(iCard);
            lstResults.add(card.getId());
        }

        return lstResults;
    }

    /*
     * kiểm tra trong danh sách các lá bài còn lại trong tay
     * xem còn lá nào cùng loại hay không
     */
    public boolean stillHaveSameSuitCard(int iCardID)
    {
        boolean result = false;
        for(int iCard = 0; iCard < lstOfCards.size(); ++ iCard)
        {
            Card card = (Card) lstOfCards.get(iCard);
            if(!card.isbIsUsed())
            {
                result = Card.isSameSuit(iCardID, card.getId());
            }
        }

        return result;
    }

    /*
     *Trả về điểm số hiện tại: Được tính theo công thức:
     * Lá bài cơ: 1 điểm
     * Q bích: 13 điểm.
     */
    public int getScore()
    {
        int iScore = 0;
        for(int iCard = 0; iCard < lstWinCards.size(); ++ iCard)
        {
            Card card = (Card) lstWinCards.get(iCard);
            if(Card.isHeartCard(card.getId()))
                iScore += 1;
            if(Card.isQueenOfSpades(card.getId()))
                iScore += 13;
        }

        //trường hợp shooting the moon
        if(iScore == 26)
            iScore = 0;

        return iScore;
    }

    /*
     * Kiếm tra xem có đạt được Shooting the Moon hay không
     *
     */
    public boolean isShootingTheMoon()
    {
        boolean bIsShootingTheMoon = false;
        boolean bHaveQueenOfSpades = false;
        int iNumOfHeartCard = 0;

        for(int iCard = 0; iCard < lstWinCards.size(); ++ iCard)
        {
            Card card = (Card) lstWinCards.get(iCard);
            if(Card.isHeartCard(card.getId()))
                iNumOfHeartCard += 1;
            if(Card.isQueenOfSpades(card.getId()))
                bHaveQueenOfSpades = true;
        }

        //trường hợp shooting the moon
        if(bHaveQueenOfSpades == true && iNumOfHeartCard == 13)
            bIsShootingTheMoon = true;
        
        return bIsShootingTheMoon;
    }
}
